package edu.szcu.vitaguard.dao;

import edu.szcu.vitaguard.entity.Medicine;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 药品DAO接口
 */
@Mapper
public interface MedicineDao {

    /**
     * 插入药品
     * @param medicine 药品对象
     * @return 影响的行数
     */
    @Insert("INSERT INTO medicine(medicine_name, medicine_type, specification, unit_price, " +
            "stock, status, create_time, update_time) " +
            "VALUES(#{medicineName}, #{medicineType}, #{specification}, #{unitPrice}, " +
            "#{stock}, #{status}, #{createTime}, #{updateTime})")
    @Options(useGeneratedKeys = true, keyProperty = "medicineId")
    int insert(Medicine medicine);

    /**
     * 根据ID查询药品
     * @param medicineId 药品ID
     * @return 药品对象
     */
    @Select("SELECT * FROM medicine WHERE medicine_id = #{medicineId}")
    Medicine selectById(Integer medicineId);

    /**
     * 查询所有药品
     * @return 药品列表
     */
    @Select("SELECT * FROM medicine")
    List<Medicine> selectAll();

    /**
     * 根据药品名称查询药品
     * @param medicineName 药品名称
     * @return 药品列表
     */
    @Select("SELECT * FROM medicine WHERE medicine_name LIKE CONCAT('%', #{medicineName}, '%')")
    List<Medicine> selectByName(String medicineName);

    /**
     * 根据药品类型查询药品
     * @param medicineType 药品类型
     * @return 药品列表
     */
    @Select("SELECT * FROM medicine WHERE medicine_type = #{medicineType}")
    List<Medicine> selectByType(String medicineType);

    /**
     * 根据状态查询药品
     * @param status 状态
     * @return 药品列表
     */
    @Select("SELECT * FROM medicine WHERE status = #{status}")
    List<Medicine> selectByStatus(Integer status);

    /**
     * 更新药品
     * @param medicine 药品对象
     * @return 影响的行数
     */
    @Update("UPDATE medicine SET medicine_name = #{medicineName}, medicine_type = #{medicineType}, " +
            "specification = #{specification}, unit_price = #{unitPrice}, stock = #{stock}, " +
            "status = #{status}, update_time = #{updateTime} WHERE medicine_id = #{medicineId}")
    int update(Medicine medicine);

    /**
     * 更新药品库存
     * @param medicineId 药品ID
     * @param stock 库存
     * @return 影响的行数
     */
    @Update("UPDATE medicine SET stock = #{stock}, update_time = NOW() WHERE medicine_id = #{medicineId}")
    int updateStock(@Param("medicineId") Integer medicineId, @Param("stock") Integer stock);

    /**
     * 删除药品
     * @param medicineId 药品ID
     * @return 影响的行数
     */
    @Delete("DELETE FROM medicine WHERE medicine_id = #{medicineId}")
    int deleteById(Integer medicineId);
}